#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
from typing import List


# 修复正确的符号
def fix_symbols(text):
    """
    修复符号，将符号替换为正确的符号

    Args:
        text (str): 需要处理的文本

    Returns:
        str: 处理后的文本
    """
    if not text:
        return text

    # 先保护小数点和英文缩写，避免被错误替换
    # 临时替换小数点为特殊标记
    text = re.sub(r"(\d)\.(\d)", r"\1<!DECIMAL!>\2", text)
    # 临时替换英文缩写中的点号
    text = re.sub(r"([A-Z])\.([A-Z])", r"\1<!ABBREV!>\2", text)

    # 修复括号：处理所有可能的括号组合，根据前文环境决定使用中文或英文括号
    # 这里需要处理四种情况：(数字)、(数字）、（数字)、（数字）
    # 规则：如果括号左边是空格或英文字符，使用英文括号；如果是中文字符，使用中文括号

    # 统一处理所有括号组合：前一个字符 + 任意左括号 + 数字 + 任意右括号
    def fix_bracket_pair(match):
        prev_char = match.group(1)  # 前一个字符
        number = match.group(2)  # 括号中的数字

        # 如果前一个字符是空格或英文字符，使用英文括号
        if prev_char == " " or (prev_char and re.match(r"[a-zA-Z]", prev_char)):
            return f"{prev_char}({number})"
        # 否则使用中文括号
        else:
            return f"{prev_char}（{number}）"

    # 匹配所有可能的括号组合：前一个字符 + 任意左括号 + 数字 + 任意右括号
    text = re.sub(r"(.)[\(（](\d+)[\)）]", fix_bracket_pair, text)

    # 处理文本开头的括号（没有前一个字符的情况）
    text = re.sub(r"^[\(（](\d+)[\)）]", r"(\1)", text)

    # 修复顿号：将英文逗号在中文列举中替换为顿号
    text = re.sub(r"([\u4e00-\u9fa5A-Z])、([\u4e00-\u9fa5A-Z])", r"\1、\2", text)

    # 修复中英文混合情况下的标点符号
    # 中文环境中的英文标点替换为中文标点
    # 逗号
    text = re.sub(r"([\u4e00-\u9fa5]),(?=[\u4e00-\u9fa5])", r"\1，", text)
    text = re.sub(r"(?<=[\u4e00-\u9fa5]),([\u4e00-\u9fa5])", r"，\1", text)

    # 分号
    text = re.sub(r"([\u4e00-\u9fa5]);(?=[\u4e00-\u9fa5])", r"\1；", text)
    text = re.sub(r"(?<=[\u4e00-\u9fa5]);([\u4e00-\u9fa5])", r"；\1", text)

    # 冒号
    text = re.sub(r"([\u4e00-\u9fa5]):(?=[\u4e00-\u9fa5])", r"\1：", text)
    text = re.sub(r"(?<=[\u4e00-\u9fa5]):([\u4e00-\u9fa5])", r"：\1", text)

    # 句号：在中文环境中使用中文句号
    # 中文后的英文句号替换为中文句号
    text = re.sub(r"(?<=[\u4e00-\u9fa5])\.(?=\s|$|[\u4e00-\u9fa5])", "。", text)
    # 句末的英文句号替换为中文句号（如果前面是中文或数字）
    text = re.sub(r"(?<=[\u4e00-\u9fa5\d])\.(?=\s*$)", "。", text)

    # 修复引用格式：将）[数字]格式规范化为）[数字]
    text = re.sub(r"）\[(\d+)\]", r"）[\1]", text)
    text = re.sub(r"\)\[(\d+)\]", r")[\1]", text)

    # 恢复被保护的内容
    text = text.replace("<!DECIMAL!>", ".")
    text = text.replace("<!ABBREV!>", ".")

    return text


def test_fix_symbols():
    """测试fix_symbols函数的各种情况"""
    test_cases = [
        # 原始测试用例
        "Ahmed M、Ahmed Z（2014)[1]认为，通过并购来是想两个企业的整合和对于实现资产模式上的整合生产",
        # 括号测试
        "这是中文(1)括号测试",  # 应该变成中文括号
        "This is English（1）bracket test",  # 应该变成英文括号
        # 混合括号测试 - 新增的重要测试用例
        "这是中文(1）混合括号",  # 中文环境，应该变成中文括号
        "这是中文（1)混合括号",  # 中文环境，应该变成中文括号
        "English (1）mixed bracket",  # 英文环境，应该变成英文括号
        "English （1)mixed bracket",  # 英文环境，应该变成英文括号
        " (1）空格开头",  # 空格开头，应该变成英文括号
        " （1)空格开头",  # 空格开头，应该变成英文括号
        "Smith (2020）引用格式",  # 英文后接，应该变成英文括号
        "研究（2020)结果",  # 中文后接，应该变成中文括号
        # 标点符号测试
        "中文,逗号,测试",  # 应该变成中文逗号
        "English, comma, test",  # 应该保持英文逗号
        "中文;分号;测试",  # 应该变成中文分号
        "中文:冒号:测试",  # 应该变成中文冒号
        # 句号测试
        "这是中文句子.",  # 应该变成中文句号
        "This is English sentence.",  # 应该保持英文句号
        "数字123.",  # 应该变成中文句号
        "小数点3.14保持不变",  # 小数点应该保持
        "缩写U.S.A.保持不变",  # 英文缩写应该保持
        # 复杂混合测试
        "研究(Smith, 2020)表明,这个结果是正确的.",
        "价格为$3.14,折扣率为10%.",
    ]

    print("=== fix_symbols函数测试结果 ===")
    for i, test_text in enumerate(test_cases, 1):
        result = fix_symbols(test_text)
        print(f"测试{i}:")
        print(f"  原文: {test_text}")
        print(f"  结果: {result}")
        print()


if __name__ == "__main__":
    test_fix_symbols()